#include<stdio.h>

struct Node  // 链表
{
    int next, data;
} node[100001];  // 用下标表示地址

int main()
{
    int start_address, num, temp;
    scanf("%d%d", &start_address, &num);
    for (int i = 0; i < num; i++)  // 输入每个点
    {
        scanf("%d", &temp);
        scanf("%d%d", &node[temp].data, &node[temp].next);
    }

    int order[num]; order[0] = start_address;  // 新建一个数组 order 用来 按顺序 存储链表地址
    for (int i = 1;; i++)
    {
        // 如果该节点的指向-1就break,同时更新有效节点的数量
        if (node[order[i - 1]].next == -1) {num = i; break;}
        order[i] = node[order[i - 1]].next;
    }

    int flag = -1, a = 0, b = num - 1;         // 根据 order 的顺序来重新链接链表,a是头 b是尾;
    for (int i = 1; i < num; i++, flag *= -1)  // flag在-1 1反复横跳来表示从左/从右来连接
    {
        if (flag == -1) {node[order[b--]].next = order[a];}
        else {node[order[a++]].next = order[b];}
    }  // 循环完之后 a,b 记录的就是排序结束后最后一个节点在order里的索引

    // 把最后一个节点的指向设置为-1; temp用来记录当前读取到的节点地址
    // (在这里temp应该为排序后第一个节点,应该为原先链表的最后一位)
    node[order[a]].next = -1; temp = order[num - 1];

    // 就可以依据链表一个一个输出了
    for (int i = 1; i < num; i++)
    {
        printf("%05d %d %05d\n", temp, node[temp].data, node[temp].next);
        temp = node[temp].next;
    }
    printf("%05d %d %d\n", temp, node[temp].data, node[temp].next);
    return 0;
}